package hao.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import hao.itheima.entity.Clazz;
import hao.itheima.entity.PageBean;
import hao.itheima.exception.BusinessException;
import hao.itheima.mapper.ClazzMapper;
import hao.itheima.mapper.StudentMapper;
import hao.itheima.service.ClazzService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class ClazzServiceImpl implements ClazzService {

    @Autowired
    private ClazzMapper clazzMapper;

    @Autowired
    private StudentMapper studentMapper;
    /**
     * 新增班级
     *
     * @param clazz
     * @return
     */


    /**
     * 分页查询
     *
     * @param clazzQueryParam
     * @return
     * @Override public PageBean page(ClazzQueryParam clazzQueryParam) {
     * //1.设置分页参数
     * PageHelper.startPage(clazzQueryParam.getPage(), clazzQueryParam.getPageSize());
     * //2.调用Mapper的列表查询方法
     * List<Clazz> clazzlist = clazzMapper.selectPage(clazzQueryParam);
     * //5.首先做极端判断
     * if (!CollectionUtils.isEmpty(clazzlist)) {
     * //4.根据查询到的时间, 补齐班级状态
     * clazzlist.forEach(clazz -> {
     * if (LocalDate.now().isBefore(clazz.getBeginDate())) {
     * clazz.setStatus("未开班");
     * } else if (LocalDate.now().isAfter(clazz.getEndDate())) {
     * clazz.setStatus("已结课");
     * } else {
     * clazz.setStatus("在读");
     * }
     * <p>
     * });
     * }
     * <p>
     * //输出展示结果
     * log.info("{}", clazzlist);
     * //3.转换成分页对象
     * Page<Clazz> clazzPage = (Page<Clazz>) clazzlist;
     * return new PageBean(clazzPage.getTotal(), clazzPage.getResult());
     * }
     */

    @Override
    public PageBean page(String name, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
        PageHelper.startPage(page, pageSize);
        List<Clazz> dataList = clazzMapper.list(name, begin, end);
        Page<Clazz> p = (Page<Clazz>) dataList;

        return new PageBean(p.getTotal(), p.getResult());
    }




    /**
     * 新增员工
     *
     * @param clazz
     */

    @Override
    public void update(Clazz clazz) {
        //设置更新时间
        clazz.setUpdateTime(LocalDateTime.now());
        //直接调用Mapper层
        clazzMapper.update(clazz);
    }
    /**
     * 删除班级数据
     *
     * @param id
     * @return
     */
    //涉及多张表, 开事务
//    @Transactional
    /*@Override 自己写的,
    public boolean delete(Integer id) {
        //1.根据id进行查询,该班级下是否有学生,然后获取返回, 进行判断, 是否要进行删除
        //直接调用Mapper层的方法进行查询
        List<Clazz> clazzes = clazzMapper.selectIsNull(id);
        //2.开始判断传过来的id班级是否有学生
        if (CollectionUtils.isEmpty(clazzes)) {
            //3.开始执行删除逻辑
            clazzMapper.delete(id);
            return true;
        } else {
            return false;
        }
    }*/

    @Override
    public void deleteById(Integer id) {
        //1. 判断该班级下是否有学生
        Integer count = studentMapper.countByClazzId(id);

        //2. 如果有, 提示错误信息
        if (count > 0) {
            //抛异常
            throw new BusinessException("对不起, 该班级下有学生, 不能直接删除");
        }

        //3. 没有, 再删除
        clazzMapper.deleteById(id);
    }
    /**
     * 查询所有班级
     *
     * @return
     */
    /*@Override
    public List<Clazz> list() {
        List<Clazz> list = clazzMapper.list();
        return list;
    }*/
    @Override
    public List<Clazz> findAll() {
        return clazzMapper.finAll();
    }

    /*@Override
    public Integer insert(Clazz clazz) {
        //补齐基本属性
        clazz.setCreateTime(LocalDateTime.now());
        clazz.setUpdateTime(LocalDateTime.now());
        //调用Mapper层进行插入
        return clazzMapper.insert(clazz);
    }*/
    //自己写的


    @Override
    public void save(Clazz clazz) {
        //补齐基本属性
        clazz.setCreateTime(LocalDateTime.now());
        clazz.setUpdateTime(LocalDateTime.now());
        //调用Mapper层进行插入
        clazzMapper.insert(clazz);
    }


    /**
     * 查询回显
     *
     * @param id
     * @return
     */
   /* @Override //自己写的  出了bug,
    public Clazz getById(Integer id) {
        //1.直接调用Mapper层进行查询数据返回
        Clazz clazz = clazzMapper.selectById(id);
        return clazz;
    }*/
    @Override
    public Clazz getInfo(Integer id) {
        return clazzMapper.getInfo(id);
    }


}
